'use strict';

/*
 * @Description: 采用 Node + Express部署的简易后端接口服务器
 * @Author: Mr.Wen
 * @Version: v1.0.0
 * @Date: 2022-08-23 09:29:10
 * @LastEditors: Mr.Wen - 文先生
 * @LastEditTime: 2023-12-28 08:56:43
 */

require('module-alias/register');
const express = require('express');
const cors = require('cors');
const path = require('path');
const fs = require('fs');

const app = new express();

const { PORT, HOST, SERVICE_NAME } = require('./utils/settings');

require('./utils/index.js');

// *** app.use 使用顺序需要注意

// 方法1：CORS解决跨域
// app.use(cors({ origin: "http://localhost:1989" }));
app.use(cors()); // CORS 允许跨域请求

// 方法2：中间件
// app.use('/*', (req, res, next) => {
//   res.header('Access-Control-Allow-Origin', '*'); // 自定义中间件，设置跨域需要的响应头
//   res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS'); // 允许任何方法
//   res.setHeader('Access-Control-Allow-Headers', 'X-Requested-Width,content-type,X-Session-Token'); // 允许任何类型
//   next(); // 要添加此代码，不然程序无法正常执行
// })

/** 解析json表单 **/
// 1. 配置解析 application/x-www-form-urlencoded 格式的表单数据的中间件，不然服务器无法解析post请求中的请求体body里为表单数据格式的参数
// 获取post请求里面的body数据(body-parser)
app.use(express.json()); // 请求体参数是JSON结构 {name:Tom,pwd:123}
app.use(express.urlencoded({ extended: false })); // 请求体参数是 name=Tom&pwd=123

/** 静态目录 **/
// app.use('/public', express.static(`${__dirname}/public`));
// app.use('/public', express.static(path.join(__dirname, 'public')));
// 配置静态目录 - join连接相对路径
app.use('/public', express.static(path.join('./', 'public')));
// 配置上传目录 - resolve连接绝对路径
app.use('/upload', express.static(path.resolve('./', 'upload')));

// TODO：注册路由对象
// TODO：此方法可进行路由全部注册引入：推荐使用
// 实现：切换不同服务，注册对应路由文件
const serveName = SERVICE_NAME.split('-').slice(0, -1).join('-'); // 取出服务名中对应的项目名称
// const servePath = path.join(__dirname, `routes/${serveName}-routes`);
// const routeArraryApi = fs
//   .readdirSync(servePath)
//   .map((item) => require(`${servePath}/${item}`));
// app.use(`/${SERVICE_NAME}`, routeArraryApi);

const servePath = path.join(__dirname, `project-routes/${serveName}`);
const routeArraryApi = fs.readdirSync(servePath).map((item) => {
  return require(`${servePath}/${item}`);
});
app.use(`/${SERVICE_NAME}`, routeArraryApi);

// TODO：中间件

/** 配置web服务 **/
app.listen(PORT, HOST, () =>
  console.log(
    '\x1B[32m%s\x1B[0m',
    `The Server Is Running At http://${HOST}:${PORT}`
  )
);
